package com.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.concurrent.Callable;

import javax.servlet.http.HttpServletRequest;

import com.system.controller.ReservePlandrawingController;
import com.system.listener.FileUploadProgressListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.multipart.MultipartFile;


public class UploadThread  implements Callable<MultipartFile>,Serializable{
	private MultipartFile file;
	private HttpServletRequest request;
	public UploadThread(MultipartFile f,HttpServletRequest r) {
		this.file = f;
		this.request = r;
	}


	public void fileupload(MultipartFile file, HttpServletRequest request) throws Exception {
		// TODO Auto-generated method stub
		//在这里设置上传的路径
		FileUploadProgressListener listener =new FileUploadProgressListener(request.getSession());

		String filepath=file.getOriginalFilename();//file.getOriginalFilename获得文件名称
		//这个是用户的文件名,如果传入两次是用户的文件名一样会替换掉
		//所以通常我们会在这里给他加密或者用一个uuid取名
		//把用户的文件名作为一个属性保存数据库
		//然后一个uuid存一个
		File file2=new File(ReservePlandrawingController.FILE_PATH+filepath);
		//CommonsMultipartFile cf= (CommonsMultipartFile)file; //MultipartFile转File
		//DiskFileItem fi = (DiskFileItem)cf.getFileItem();

		//File f = fi.getStoreLocation();
		//InputStream	in=null;
	   /* if(f.exists()){
	    	in = new FileInputStream(f);
	    }
	    else
	    {
	    没有必要使用临时文件,当使用临时文件时,文件太小就不存入临时文件区,所以
	  会报找不到系统指定的文件位置
	  所以没有必要使用临时文件,可以直接获取物理文件地址使用file.getInputStream();
*/
		InputStream	in= file.getInputStream();
		FileOutputStream fos = new FileOutputStream(file2);
		//放入缓冲区(一次性读取1024字节),以免造成内存溢出
		byte[] buffer=null;
		if(file.getSize()<10240){
			buffer=new byte[24];
		}
		else if(file.getSize()>10240 && file.getSize()<51200 ){
			buffer=new byte[1024];
		}else {
			buffer=new byte[10240];
		}

		//声明一个变量,用来接收读取完的剩余字节
		int len=0;
		//声明一个输出流,用来将缓冲区的字节响应到客户端
		//在流读写的时候不能使用System.out.println();打印控制台会影响读写异常

		while ((len=in.read(buffer))!=-1) {
			try {
				fos.write(buffer,0,len);
			} catch (Exception e) {
				// TODO: handle exception
			}
			finally{

				if(file.getSize()-in.available()<=0){
					System.out.println(file.getOriginalFilename()+"::::::::::::::::::::"+file.getSize());
				}
//System.out.println(file.getOriginalFilename()+"::"+file.getSize()+":::"+in.available());
				listener.update2(file.getSize()-in.available(), file.getSize(),file.getOriginalFilename());
				Thread.sleep(50);
			}


			//listener.update(file.getSize()-in.available(), file.getSize(),fileId);


			fos.flush();
		}
		//f.delete();//删除临时文件
		in.close();
		fos.close();


		//listner.update(byteBuffer.bytesToLong(byteBuffer.inputStream2Byte(file.getInputStream())), file.getSize(), 1);


	}
	@Override
	public MultipartFile call() throws Exception {
		try {

			fileupload(file,request);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public static  File MutiPartFileToFile(MultipartFile multipartFile){

		File file=new File(ReservePlandrawingController.FILE_PATH+multipartFile.getOriginalFilename());


		return  file;
	}



}
